// utils/request.ts
import axios, {
  AxiosInstance,
  InternalAxiosRequestConfig,
  AxiosResponse,
  AxiosError
} from 'axios'
import { Toast } from 'antd-mobile'

const baseURL = 'https://v3pz.itndedu.com/v3pz' // ✅ 修复末尾空格

const instance: AxiosInstance = axios.create({
  baseURL,
  timeout: 10000, // 建议 10s 超时（1000ms 太短）
  headers: { terminal: 'h5' }
})

// 请求拦截器
instance.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    // Toast.show({
    //   icon: 'loading',
    //   content: '加载中…'
    // })
    const token = localStorage.getItem('h5-token')
    const publicUrls = ['/login'] // 免 token 接口

    // 为非公开接口添加 token
    if (token && !publicUrls.some((u) => config.url?.startsWith(u))) {
      config.headers['h-token'] = token
    }

    return config
  },
  (error: AxiosError) => {
    return Promise.reject(error)
  }
)

// 响应拦截器
instance.interceptors.response.use(
  (response: AxiosResponse) => {
    const { code, message } = response.data

    // ✅ 业务成功：code 符合预期（假设 200 或 0 表示成功）
    if (code === 10000 || code === 0) {
      return response.data // 直接返回 data
    }

    // ⚠️ 业务错误处理
    if (code === -1) {
      // 自定义逻辑
      Toast.show({ icon: 'fail', content: message || '操作失败' })
    } else if (code === -2) {
      // token 失效
      localStorage.removeItem('h5-token')
      localStorage.removeItem('userinfo')
      Toast.show({ icon: 'fail', content: '登录已过期，请重新登录' })
      // 可跳转登录页
      window.location.href = '/login'
    } else {
      // 其他业务错误
      Toast.show({ icon: 'fail', content: message || '请求失败' })
    }

    // 业务错误也 reject，让调用方 catch
    return Promise.reject(new Error(message || 'Request failed'))
  },
  (error: AxiosError) => {
    // 🌐 网络错误 / 超时 / HTTP 状态码错误
    let message = '网络请求异常'

    if (error.code === 'ECONNABORTED' || error.message.includes('timeout')) {
      message = '请求超时，请稍后重试'
    } else if (error.response) {
      // HTTP 状态码错误（4xx, 5xx）
      switch (error.response.status) {
        case 401:
          message = '未授权，请登录'
          localStorage.removeItem('h5-token')
          localStorage.removeItem('userinfo')
          break
        case 403:
          message = '拒绝访问'
          break
        case 404:
          message = '请求地址不存在'
          break
        case 500:
          message = '服务器内部错误'
          break
        default:
          message = `请求失败 (${error.response.status})`
      }
    } else if (error.request) {
      message = '网络连接失败，请检查网络'
    }

    Toast.show({ icon: 'fail', content: message })
    return Promise.reject(error)
  }
)

export default instance
export { baseURL }
